﻿//2461. 长度为 K 子数组中的最大和
//给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和：
//子数组的长度是 k，且
//子数组中的所有元素 各不相同 。
//返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件，返回 0 。
//子数组 是数组中一段连续非空的元素序列。


class Solution
{
public:
    unordered_map<int, int> table;
    long long maximumSubarraySum(vector<int>& nums, int k)
    {
        long long sum = 0, ret = 0;
        for (int i = 0; i < k; i++)
        {
            table[nums[i]]++;
            sum += nums[i];
        }
        if (table.size() == k) ret = sum;
        int n = nums.size();
        for (int i = 1; i <= n - k; i++)
        {
            sum += nums[i + k - 1];
            sum -= nums[i - 1];
            table[nums[i - 1]]--;
            if (table[nums[i - 1]] == 0) table.erase(nums[i - 1]);
            table[nums[i + k - 1]]++;
            if (table.size() == k) ret = max(sum, ret);
        }
        return ret;
    }
};